/*
 * Archivo de encabezamiento: contrato con el TAD Lista Lineal.
 * simplemente encadenada ordenada, sin repeticiones con header.
 * Utiliza shallow copy y sirve para tipos de datos genericos.
 * No admite constantes.
 * Obtenida de la catedra de Estructura de Datos y Algoritmos.
 */

#ifndef	_LISTALINEAL_ORDENADA_CONHEADER_SINREP_H
#define _LISTALINEAL_ORDENADA_CONHEADER_SINREP_H

#include <stdlib.h>	/* para que reconozca al size_t */

/* Tipo de datos que manipula el TAD LISTA */
typedef void * listElementT;

/* Tipo que define al TAD LISTA */
typedef struct listCDT *listADT;

/* tipo que tiene que tener la funcion de comparacion del usuario */
typedef int (*cmpfnT) (listElementT, listElementT);
typedef void (*freefnT) (listElementT);

/*
 * ========================================================
 * Operaciones con las que se puede acceder al TAD
 * ========================================================
 */


/*
 * Crea una nueva lista.
 * recibe un cmpfnT para comparar los elementos de la lista,
 * y un size_t con el tama�o de cada elemento
 * retorna:
 * 		una lista vacia.
 *	en caso de error, aborta.
 */
listADT NewList( cmpfnT cmp, freefnT libera, size_t tam);

/*
 * Inserta 'element' en 'list'.
 * Es shallow copy.
 */
void Insert(listADT list, listElementT element);


/*
 * Borra 'element' de 'list'.
 * retorna:
 * 		1 si pudo borrarlo
 * 		0 si el elemento no existia
 *
 */
int Delete(listADT list, listElementT element);

/*
 * retorna:
 *		1 si la lista esta vacia
 * 		0 si tiene por lo menos 1 elemento
 */
int ListIsEmpty(listADT list);


/*
 * retorna:
 * 		1 si 'element' pertenece a 'list'
 * 		0 en caso contrario
 */
int ElementBelongsList(listADT list, listElementT element);


/*
 * esta funcion es necesaria para recorrer todos los datos de la lista.
 * debe ser llamada antes de la primera invocacion de GetDato
 */
void SetBegin(listADT list);

/*
 * copia en 'element' el proximo elemento del recorrido de la lista.
 * retorna:
 *		1 si aun hay elementos en la lista
 *		0 si se termino de recorrer la lista, en ese caso, no se copia
 *			nada en 'element'
 */
int GetDato(listADT list, listElementT element);


/* dado un element, lo busca en la lista, y lo retorna con toda su informacion,
 * si no existe, retorna NULL.
 * Devuelve una shallow copy
 */
listElementT GetDatoByComp(listADT list, listElementT element);


/*
 * libera la lista, y todos los elementos que estan almacenados en ella.
 */
void FreeList(listADT list);



/*
 * GetListCount devuelve la cantidad de elementos que hay en la lista.
 *
 */
int GetListCount(listADT list);

/*
	ChangeCompareFunc cambia la funcion de comparacion de la lista
*/
void ChangeCompareFunc(listADT list, cmpfnT cmp);

#endif


